package com.xuecheng.content.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xuecheng.base.exception.CommonError;
import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.base.module.pageParams;
import com.xuecheng.base.module.pageResult;
import com.xuecheng.content.mapper.CourseBaseMapper;
import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.mapper.CourseMarketMapper;
import com.xuecheng.content.service.CourseBaseInfoService;
import com.xuecheng.module.dto.AddCourseDto;
import com.xuecheng.module.dto.CourseBaseInfoDto;
import com.xuecheng.module.dto.EditCourseDto;
import com.xuecheng.module.dto.QueryCourseParamsDto;
import com.xuecheng.module.po.CourseBase;
import com.xuecheng.module.po.CourseCategory;
import com.xuecheng.module.po.CourseMarket;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author 星河一叶Ck
 * @date 2025/4/15
 */

@Service
@Slf4j
@RequiredArgsConstructor
public class CourseBaseInfoServiceImpl implements CourseBaseInfoService {

    private final CourseBaseMapper courseBaseMapper;
    private final CourseMarketMapper courseMarketMapper;
    private final CourseCategoryMapper courseCategoryMapper;

    /**
     * 查询课程基本信息
     * @param pageParams 分页页码和每页展示
     * @param queryCourseParamsDto 查询的条件
     * @return
     */
    @Override
    public pageResult<CourseBase> queryCourseBaseList(pageParams pageParams, QueryCourseParamsDto queryCourseParamsDto) {
        // 查询构建条件
        LambdaQueryWrapper<CourseBase> queryWrapper = new LambdaQueryWrapper<>();

        // 处理queryCourseParamsDto为null的情况
        if (queryCourseParamsDto == null) {
            queryCourseParamsDto = new QueryCourseParamsDto(); // 创建默认对象
        }
        // 模糊查询
        queryWrapper.like(
                StringUtils.isNotEmpty(queryCourseParamsDto.getCourseName()),
                CourseBase::getName,
                queryCourseParamsDto.getCourseName());
        queryWrapper.eq(StringUtils.isNotEmpty(queryCourseParamsDto.getAuditStatus()),
                CourseBase::getAuditStatus,
                queryCourseParamsDto.getAuditStatus());
        queryWrapper.eq(StringUtils.isNotEmpty(queryCourseParamsDto.getPublishStatus()),
                CourseBase::getStatus,
                queryCourseParamsDto.getPublishStatus());

        Page<CourseBase> page = new Page<>(pageParams.getPageNo(), pageParams.getPageSize());

        // 查询数据的结果
        Page<CourseBase> pageResult = courseBaseMapper.selectPage(page, queryWrapper);
        List<CourseBase> records = pageResult.getRecords();
        long total = pageResult.getTotal();

        pageResult<CourseBase> result = new pageResult<>(records, total, pageParams.getPageNo(), pageParams.getPageSize());
        return result;
    }

    /**
     * 添加课程基本信息
     * @param companyId 机构id (通过权限验证获取到)
     * @param dto 添加课程基本信息
     * @return
     */
    @Transactional
    @Override
    public CourseBaseInfoDto createCourseBase(Long companyId, AddCourseDto dto) {
        // 1. 合法的校验
        if (StringUtils.isBlank(dto.getName())) {
            throw new XueChengPlusException("课程名称为空");
        }
        if (StringUtils.isBlank(dto.getMt())) {
            throw new XueChengPlusException("课程分类为空");
        }
        if (StringUtils.isBlank(dto.getSt())) {
            throw new XueChengPlusException("课程分类为空");
        }
        if (StringUtils.isBlank(dto.getGrade())) {
            throw new XueChengPlusException("课程等级为空");
        }
        if (StringUtils.isBlank(dto.getTeachmode())) {
            throw new XueChengPlusException("教育模式为空");
        }
        if (StringUtils.isBlank(dto.getUsers())) {
            throw new XueChengPlusException("适应人群为空");
        }
        if (StringUtils.isBlank(dto.getCharge())) {
            throw new XueChengPlusException("收费规则为空");
        }
        // 2. 添加课程基本信息
        // 2.1 新增对象
        CourseBase courseBaseNew = new CourseBase();
        // 2.2 拷贝属性 (属性名相同的会拷贝过去)
        BeanUtils.copyProperties(dto, courseBaseNew);
        // 2.3 设置一些属性 (拷贝里没有的 或者是关键的 放在拷贝后设置是因为防止被覆盖)
        // 2.3.1 设置审核状态
        courseBaseNew.setAuditStatus("002002");
        // 2.3.2 设置发布状态
        courseBaseNew.setStatus("203001");
        // 2.3.3 设置机构id
        courseBaseNew.setCompanyId(companyId);
        // 2.3.4 添加时间
        courseBaseNew.setCreateDate(LocalDateTime.now());
        // 2.4 插入课程基本信息
        int insert = courseBaseMapper.insert(courseBaseNew);
        if (insert <= 0) {
            throw new XueChengPlusException("新增课程基本信息失败");
        }
        // 3. 添加课程营销信息
        CourseMarket courseMarketNew = new CourseMarket();
        BeanUtils.copyProperties(dto, courseMarketNew);
        courseMarketNew.setId(courseBaseNew.getId());
        int i = saveCourseMarket(courseMarketNew);

        if (i <= 0) {
            throw new XueChengPlusException("新增课程营销信息失败");
        }

        // 查询课程基本信息及营销信息并返回
        return getCourseBaseInfo(courseBaseNew.getId());
    }

    // 保存课程营销信息
    private int saveCourseMarket (CourseMarket courseMarket) {
        // 收费规则
        String charge = courseMarket.getCharge();
        if (StringUtils.isBlank(charge)) {
            throw new XueChengPlusException("收费规则没有选择");
        }
        // 如果是收费的
        if (charge.equals("201001")) {
            // 若价格是空白的 报错
            Float price = courseMarket.getPrice();
            if (price == null || price <= 0) {
                throw new XueChengPlusException("课程价格不能为空且必须大于0");
            }
        }

        // 然后判断是添加课程还是修改
        // 若不存在信息 那么就是添加 否则是修改
        CourseMarket courseMarketNew = courseMarketMapper.selectById(courseMarket.getId());
        if (courseMarketNew == null) {
            return courseMarketMapper.insert(courseMarket);
        } else {
            // 修改 则将传递过来的信息覆盖查询到的信息
            BeanUtils.copyProperties(courseMarket, courseMarketNew);
            // courseMarketNew.setId(courseMarket.getId());
            return courseMarketMapper.updateById(courseMarketNew);
        }
    }

    //根据课程id 查询课程基本信息，包括基本信息和营销信息
    public CourseBaseInfoDto getCourseBaseInfo (long courseId) {
        // 查询课程基本信息
        CourseBase courseBase = courseBaseMapper.selectById(courseId);
        if (courseBase == null) {
            return null;
        }
        // 查询营销基本信息
        CourseMarket courseMarket = courseMarketMapper.selectById(courseId);
        // 创建对象 并且合并以上两个
        CourseBaseInfoDto courseBaseInfoDto = new CourseBaseInfoDto();
        BeanUtils.copyProperties(courseBase, courseBaseInfoDto);
        // 如果营销不为空 那么就拷贝进去 否则不拷贝 因为存在免费课程的情况
        if (courseMarket != null) {
            BeanUtils.copyProperties(courseMarket, courseBaseInfoDto);
        }

        // 添加分类
        // 根据st来查询对应id的分类名 然后进行设置
        // 这里做这个是因为这个是查询使用的 所以返回出去 插入的时候是已经插入插进来了 所以这里可以查到
        CourseCategory courseCategoryBySt = courseCategoryMapper.selectById(courseBase.getSt());
        if (courseCategoryBySt != null) {
            courseBaseInfoDto.setStName(courseCategoryBySt.getName());
        }
        CourseCategory courseCategoryByMt = courseCategoryMapper.selectById(courseBase.getMt());
        if (courseCategoryByMt != null) {
            courseBaseInfoDto.setMtName(courseCategoryByMt.getName());
        }

        return courseBaseInfoDto;
    }

    @Transactional
    @Override
    public CourseBaseInfoDto updateCourseBase(Long companyId, EditCourseDto editCourseDto) {
        // 校验合法性
        // 逻辑校验: 当前机构只能修改该机构的课程不能修改别的
        // 根据课程id查询课程 然后查询到的课程信息查询机构id然后进行校验判断
        CourseBase courseBase = courseBaseMapper.selectById(editCourseDto.getId());
        if (courseBase == null) {
            // CommonError courseNotExist = CommonError.COURSE_NOT_EXIST;
            throw new XueChengPlusException("课程不存在");
        }
        if (!courseBase.getCompanyId().equals(companyId)) {
            throw new XueChengPlusException("本机构只能修改本机构的课程");
        }

        // 封装信息
        // 将传进来的信息覆盖课程的基本信息
        BeanUtils.copyProperties(editCourseDto, courseBase);
        courseBase.setChangeDate(LocalDateTime.now());

        // 更新数据库
        // 更新课程基本信息
        int i1 = courseBaseMapper.updateById(courseBase);
        if (i1 <= 0) {
            throw new XueChengPlusException("更新课程基本信息失败");
        }
        // 更新营销基本信息
        CourseMarket courseMarket = new CourseMarket();
        BeanUtils.copyProperties(editCourseDto, courseMarket);
        int i = saveCourseMarket(courseMarket);
        if (i <= 0) {
            throw new XueChengPlusException("更新课程营销信息失败");
        }

        // 查询课程信息 (这里是已经更新好了的)
        CourseBaseInfoDto courseBaseInfo = this.getCourseBaseInfo(editCourseDto.getId());
        return courseBaseInfo;
    }
}
